// Have include guard.
#ifndef FPK_FILTER_HPP
#define FPK_FILTER_HPP

/**
 *  The Filter template class is a base class for filters that take a value and output a value.
 *  
 *  @tparam Input The type of the input object.
 *  @tparam Output The type of the output object.
 */
template<typename Input, typename Output = Input>
class Filter
{
	public:
		/**
		 *  Destructor for Filter.
		 */
		virtual ~Filter()
		{
		}
		
		/**
		 *  Apply the filter to an input.
		 *  
		 *  @param input A reference to the input (which will not get modified).
		 *  @return The output of the filtered input.
		 */
		virtual Output Apply(const Input &input) const = 0;
};

#endif // #ifndef FPK_FILTER_HPP
